home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_08_12
/
8n12113b
< prev
next >
Wrap
Text File
|
1990-07-23
|
3KB
|
101 lines
/*
* server.c
*
* Server process for time accounting system, non-network version.
* This should be run as a daemon or in the background.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include "time_entry.h"
main()
{
int skt_id, /* Socket descriptor */
msg_sock, /* Socket that will accept messages */
i,j;
EVENT_TYPE event; /* An event from one of the client processes */
struct sockaddr sa; /* Socket address structure */
char buff[80];
FILE *time_file;
/* Open the output file in append mode */
if(!(time_file = fopen(TIME_FILE, "a+"))){
perror("Opening time file");
exit(1);
}
fprintf(time_file, "\n***STARTUP***\n");
/*
* Create a stream type socket in the UNIX domain, with the
* default protocol.
*/
skt_id = socket(AF_UNIX, SOCK_STREAM, 0);
if(skt_id == -1){
/* Error. Cleanup & leave */
perror("Can't create socket");
exit(1);
}
/*
* Now that the socket exists, set up the address structure
* and bind an address to the socket.
*/
sa.sa_family = AF_UNIX;
strcpy(sa.sa_data, SOCKET_NAME);
if(bind(skt_id, &sa, sizeof(sa)) == -1){
perror("Can't bind address");
exit(1);
}
listen(skt_id, 5); /* Set up the queue for requests */
/*
* Main loop is here. Accept a connection, read the message,
* and write the time record...
*/
do{
/*
* Accept a connection. Accept will return a new socket
* descriptor with the same properties as the original. This
* new socket is used for read and write
*/
msg_sock = accept(skt_id, 0, 0);
if(msg_sock == -1){
perror("Can't accept connections");
exit(1);
}
if(read(msg_sock, &event, sizeof(event)) < 0){
perror("Read");
exit(1);
}
if(event.event_cd != SHUT_DOWN){
if (fwrite(&event, sizeof(event),1,time_file) != 1){
perror("Write");
exit(1);
}
}
close(msg_sock); /* Close the socket retruned by accept... */
}while(event.event_cd != SHUT_DOWN);
/* Cleanup */
unlink(SOCKET_NAME);
fprintf(time_file, "\n***SHUTDOWN***\n");
fclose(time_file);
exit(0);
}